package com.cwc.menu.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

/**
 * @author wxhntmy
 */
@Setter
@Getter
public class Msg<T> implements Serializable {

    private boolean ok = false;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String message = "error";

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private T data;

    /**
     * 成功
     *
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> ok() {
        return new Msg().success();
    }

    /**
     * 成功 自定义提示信息
     *
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> ok(String message) {
        return new Msg().success(message);
    }

    /**
     * 成功 返回结果
     *
     * @param data 返回结果
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> ok(T data) {
        return new Msg(data).success();
    }

    /**
     * 成功 返回结果 & 自定义提示信息
     *
     * @param data 返回结果
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> ok(T data, String message) {
        return new Msg(data).success(message);
    }

    /**
     * 失败
     *
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> fail() {
        return new Msg().failure();
    }

    /**
     * 失败 自定义提示信息
     *
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> fail(String message) {
        return new Msg().failure(message);
    }

    /**
     * 失败 返回结果
     *
     * @param data 返回结果
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> fail(T data) {
        return new Msg(data).failure();
    }

    /**
     * 失败 返回结果 & 自定义提示信息
     *
     * @param data 返回结果
     * @return Response
     */
    @SuppressWarnings("unchecked")
    public static <T> Msg<T> fail(T data, String message) {
        return new Msg(data).failure(message);
    }

    /**
     * 构造函数
     *
     * @param data 数据
     */
    private Msg(T data) {
        this.data = data;
    }

    /**
     * 构造函数
     *
     */
    private Msg() {

    }

    /**
     * 成功
     *
     * @return Response
     */
    private Msg success() {
        this.ok = true;
        this.message = "ok";
        return this;
    }

    /**
     * 成功 自定义提示信息
     *
     * @param message 成功提示信息
     * @return Response
     */
    private Msg success(String message) {
        this.ok = true;
        this.message = message;
        return this;
    }

    /**
     * 失败
     *
     * @return Response
     */
    private Msg failure() {
        this.ok = false;
        this.message = "error";
        return this;
    }

    /**
     * 失败 自定义提示信息
     *
     * @param message 错误提示信息
     * @return Response
     */
    private Msg failure(String message) {
        this.ok = false;
        this.message = message;
        return this;
    }
}
